export default class SocketService{
    // 定义单例(单个实例)模式
    static instance=null
    static getInstance(){
        if(!this.instance){//防止创建多个实例对象
            this.instance=new SocketService()
        }
        return this.instance
    }
    // 定义连接服务器的socket实例对象
    ws=null
    // 是否连接服务器成功标识
    connected=false
    // 客户端尝试发送数据给服务器次数
    sendRetryCount=0
    // 客户端尝试连接服务器次数
    connectRetryCount=0
    // 存储回调函数,想法是将数据传递给对应的components下的vue文件
    callBackMapping={}
    // 定义连接服务器方法
    connect(){
        if(!window.WebSocket){
            return console.log('你的浏览器不支持WebSocket对象');
        }
        this.ws=new WebSocket('ws://localhost:9998')
        this.ws.onopen=()=>{
            console.log('连接服务器成功');
            this.connected=true
            // 重置连接服务器次数
            this.connectRetryCount=0
            clearInterval(this.connectRetryTimeId)
        }
        // 失败有两种情况：1.本身连接服务器失败2.连接成功后，关闭了服务器
        this.ws.onclose=()=>{
            console.log('连接服务器失败');
            this.connected=false
            this.connectRetryCount++
            // 断开重连服务器机制
            // setTimeout只执行一次
            setTimeout(()=>{
                this.connect()
            },500*this.connectRetryCount)
        }
        this.ws.onmessage=msg=>{
            console.log('从服务器传来数据了');
            // 真正服务器发送的数据是msg.data
            // console.log(msg.data);
            const recvData=JSON.parse(msg.data)
            const action=recvData.action
            const socketType=recvData.socketType
            if(this.callBackMapping[socketType]){
                if(action==='getData'){
                    const realData=JSON.parse(recvData.data)
                    this.callBackMapping[socketType].call(this,realData)
                }else if(action==='fullScreen'){
                    this.callBackMapping[socketType].call(this,recvData)
                }else if(action==='changeTheme'){
                    this.callBackMapping[socketType].call(this)
                }
            }
        }
    }
    // 注册回调函数
    registerCallBack(socketType,callBack){
        this.callBackMapping[socketType]=callBack
    }
    // 去除某个回调函数
    unRegisterCallBack(socketType){
        this.callBackMapping[socketType]=null
    }
    // 向服务器发送数据
    send(data){
        // 连接服务器也需时间，如果先执行发送数据的函数就会报错，用重发机制解决
        if(this.connected){
            this.ws.send(JSON.stringify(data))
            // 连接上服务器了，重置发送数据给服务器的次数
            this.sendRetryCount=0
        }else{
            // 重发数据机制
            // 等待一段时间再次发送
            // 若是服务器关闭，仍然采用500ms重连一次，不合适，应该延长多少时间间隔重连一次。这样就不会太浪费时间资源
            this.sendRetryCount++
            setTimeout(()=>{
                this.send(data)
            },500*this.sendRetryCount)
        }
    }
}